{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **`malloc/free` 与 `new/delete` 差异，早期偏好原因**\n",
    "\n",
    "- `malloc/free`：纯 C 接口，只分配/释放原始内存，不调用构造或析构，也不记录类型信息；返回 `void*` 需显式转换。\n",
    "- `new/delete`：分配内存并调用构造函数；`delete` 先调析构再释放。数组版本 `new[]/delete[]` 还存储元素个数。\n",
    "- 早期偏好 `malloc`：可与 C 代码共享；无异常（`new` 失败抛 `std::bad_alloc`），更易与自定义内存池对接；编译器对 `new` 支持尚不成熟时只能用 `malloc`。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **C 风格字符串管理与安全**\n",
    "\n",
    "- 约定以 `'\\0'` 结尾，通常用 `char[]`。\n",
    "- 避免 `strcpy/strcat`：改用 `strncpy`, `snprintf`, `strncat`，并在写入前检查目标缓冲区长度；或使用 `memcpy` + 手动加终止符。\n",
    "- 可用 `size_t len = strlen(src); if (len >= dst_size) ...` 做边界检查。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **显式析构与 placement new**\n",
    "\n",
    "- 对象通过 placement new (`new (buffer) T(args)`) 构造在已有内存中，需显式调用析构：`obj->~T();`，然后释放底层缓冲（若需要）。\n",
    "- 必须确保析构只调用一次，且 buffer 生命周期覆盖对象；常用于内存池或自定义容器。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **指针 vs 引用**\n",
    "\n",
    "- 指针可为空、可重新指向别处，语义上是“对象地址”。\n",
    "- 引用必须绑定到对象，无法更改绑定，语法更接近别名。\n",
    "- 一些老代码不用引用：担心隐式别名导致困惑；函数参数用指针可显式检查 `nullptr`；调试时指针更直观。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **`const char*`, `char* const`, `const char* const`**\n",
    "\n",
    "- `const char* p`：指向常量字符的指针（数据不可改，指针可变）。\n",
    "- `char* const p`：常量指针指向可变字符（指针不可改，数据可改）。\n",
    "- `const char* const p`：指针与数据都不可改。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **函数指针声明与状态机数组**\n",
    "\n",
    "- 声明：`int (*pf)(double);` 表示指向 `int(double)` 的指针。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cpp"
    }
   },
   "outputs": [],
   "source": [
    "int add(double); int sub(double);\n",
    "int (*handlers[])(double) = { add, sub };\n",
    "state = handlers[state](value);"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **宏谨慎使用 & 传统用法**\n",
    "\n",
    "- 问题：无作用域、无类型、安全隐患；调试困难。\n",
    "- 常见用法：include guard (`#ifndef H`)、常量定义（`#define PI 3.14`）、条件编译（`#ifdef DEBUG`）、简单 inline 函数（`#define SQR(x) ((x)*(x))`）。\n",
    "- 注意括号、避免副作用。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## **`extern \"C\"` 作用**\n",
    "\n",
    "- 禁止 C++ 名字改编（name mangling），生成 C 链接符号。\n",
    "- 必须用于与 C 库互调、导出插件接口给 C 程序、或让 C 编译器认识的符号（如 `extern \"C\" void foo();`）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **`struct` vs `class` 唯一区别**\n",
    "\n",
    "- 默认访问控制：`struct` 默认 public，`class` 默认 private。\n",
    "- 老代码偏 `struct`：语义接近 C 结构体，成员默认公开，便于 POD 数据传输。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **对象内存布局与填充**\n",
    "\n",
    "- 成员按声明顺序排列，但编译器可插入填充字节以满足对齐。\n",
    "- `sizeof` 受最大对齐要求影响；可通过 `#pragma pack` 或成员排序减少填充。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **浅拷贝 vs 深拷贝 & Rule of Three**\n",
    "\n",
    "- 浅拷贝：复制指针值，共享资源；析构时可能 double free。\n",
    "- 深拷贝：复制内容，指针指向独立资源。\n",
    "- Rule of Three：自定义拷贝构造、拷贝赋值、析构，确保资源正确管理。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **无 STL 时的动态数组/链表**\n",
    "\n",
    "- 动态数组：维护 `capacity`, `size`, 使用 `malloc/realloc`，手动 `memcpy`。\n",
    "- 链表：定义节点结构，`next` 指针，提供 push/pop/遍历函数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **`volatile` 历史用法**\n",
    "\n",
    "- 告诉编译器该对象可能被外部环境修改，不要优化掉读写；典型用于内存映射 IO、硬件寄存器。\n",
    "- 在嵌入式仍常见，用于 busy-wait 标志位。现代多线程同步需配合原子/内存序。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **多文件组织 & include guard**\n",
    "\n",
    "- 传统：声明放头文件 (`.h`)，实现放源文件 (`.cpp`)，其他文件 `#include`。\n",
    "- include guard 防止重复包含导致重定义："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cpp"
    }
   },
   "outputs": [],
   "source": [
    "#ifndef FOO_H\n",
    "#define FOO_H\n",
    "...\n",
    "#endif"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **`enum` vs `enum class`**\n",
    "\n",
    "- 传统 `enum` 自动提升为整数，易与其他枚举混用；老代码利用其互转方便。\n",
    "- `enum class` 需显式转换，作用域内限定。老派场景下如果需要隐式比较/算术，仍用传统 `enum`。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **`friend` 的用途**\n",
    "\n",
    "- 允许特定函数/类访问私有成员。\n",
    "- 早期常用于两个紧密耦合类（如 `Matrix` 与 `Vector`）共享内部表示，或实现 operator overloading。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **禁用异常的原因与替代**\n",
    "\n",
    "- 老项目担心性能开销、二进制大小、ABI 不稳定或与 C 库兼容。\n",
    "- 替代：返回错误码、设置 `errno`/全局状态、回调报告错误码。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **C 风格 `union` 典型用途**\n",
    "\n",
    "- 在同一内存片段存储不同类型，节省空间（例如网络包 header/数据）。\n",
    "- 实现简易多态：通过 `tag` + `union`（tagged union）。需手动维护当前活跃成员。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **传统内存调试技巧**\n",
    "\n",
    "- 哨兵值：在前后写入特定字节（0xDEADBEEF）检测越界。\n",
    "- `memset` 释放后置特定值（0xCD）。\n",
    "- 日志记录 `malloc`/`free` 来源；使用 CRT debug heap（`_CrtDumpMemoryLeaks`）。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **为何手写 `for (int i = 0; i < n; ++i)`**\n",
    "\n",
    "- 控制精确，避免迭代器开销；适合旧式数组。\n",
    "- 范围 for/STL 算法被视为“黑盒”或担心生成代码不透明。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **无模板下的“泛型”容器**\n",
    "\n",
    "- 使用 `void*` 存储元素，用户自行转换。\n",
    "- 通过宏生成类型专用容器："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "vscode": {
     "languageId": "cpp"
    }
   },
   "outputs": [],
   "source": [
    "#define DECLARE_VECTOR(T, NAME) ..."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "- 缺点：缺少类型安全。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **预编译头（PCH）与“头文件先编译”**\n",
    "\n",
    "- 将常用头文件编译成 PCH，后续翻译单元直接引用，加速构建。\n",
    "- 传统做法：`stdafx.h` 或 `pch.h`，在每个源文件首行 `#include \"pch.h\"`。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **`register` 关键字历史**\n",
    "\n",
    "- 提示编译器将变量放 CPU 寄存器，提高访问速度。现代编译器优化器更智能，关键字已被忽略，但老代码中仍可见。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **早期接口实现：纯虚基类**\n",
    "\n",
    "- 定义抽象基类 `struct IFoo { virtual void bar() = 0; virtual ~IFoo(){} };`\n",
    "- 客户端通过指针/引用访问，实现多态；类似 COM 接口。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# **多重继承陷阱**\n",
    "\n",
    "- 指针转换复杂，需要虚继承避免菱形重复基类。\n",
    "- 构造顺序：基类 -> 成员 -> 派生；虚基类由最派生类负责构造。\n",
    "- vtable 布局复杂，容易出现二义性调用；老派建议谨慎使"
   ]
  }
 ],
 "metadata": {
  "language_info": {
   "name": "python"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
